home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / temacd / wikipad / WikidPad-1.9beta2.exe / {app} / extensions / WikiSyntax.py < prev   
Text File  |  2007-02-24  |  11KB  |  260 lines

  1. import locale
  2. import string
  3.  
  4. import pwiki.srePersistent as re
  5. from pwiki.StringOps import mbcsDec
  6.  
  7. locale.setlocale(locale.LC_ALL, '')
  8.  
  9.  
  10. # String containing the delimiter between the title of a wiki word (to show in
  11. # HTML and the real word, as e.g. [title | WikiWord]
  12. TitleWikiWordDelimiter = ur"|"
  13.  
  14. # Same, escaped for regular expression
  15. TitleWikiWordDelimiterPAT = ur"\|"
  16.  
  17.  
  18. PlainCharacterPAT = ur"(?:[^\\]|\\.)"
  19.  
  20. PlainEscapedCharacterRE = re.compile(ur"\\(.)",
  21.         re.DOTALL | re.UNICODE | re.MULTILINE)
  22.  
  23. # PlainCharactersRE = re.compile(PlainCharacterPAT + "+",
  24. #         re.DOTALL | re.UNICODE | re.MULTILINE)
  25.  
  26.  
  27. # basic formatting
  28. BoldRE          = re.compile(ur"\*(?=\S)(?P<boldContent>" + PlainCharacterPAT +
  29.         ur"+?)\*",
  30.         re.DOTALL | re.UNICODE | re.MULTILINE)
  31. ItalicRE        = re.compile(ur"\b_(?P<italicContent>" + PlainCharacterPAT +
  32.         ur"+?)_\b",
  33.         re.DOTALL | re.UNICODE | re.MULTILINE)
  34. HtmlTagRE = re.compile(
  35.         ur"</?[A-Za-z][A-Za-z0-9]*(?:/| [^\n>]*)?>",
  36.         re.DOTALL | re.UNICODE | re.MULTILINE)
  37. Heading4RE      = re.compile(u"^\\+\\+\\+\\+(?!\\+) ?(?P<h4Content>" +
  38.         PlainCharacterPAT + ur"+?)\n",
  39.         re.DOTALL | re.UNICODE | re.MULTILINE)
  40. Heading3RE      = re.compile(u"^\\+\\+\\+(?!\\+) ?(?P<h3Content>" +
  41.         PlainCharacterPAT + ur"+?)\n",
  42.         re.DOTALL | re.UNICODE | re.MULTILINE)
  43. Heading2RE      = re.compile(u"^\\+\\+(?!\\+) ?(?P<h2Content>" +
  44.         PlainCharacterPAT + ur"+?)\n",
  45.         re.DOTALL | re.UNICODE | re.MULTILINE)
  46. Heading1RE      = re.compile(u"^\\+(?!\\+) ?(?P<h1Content>" +
  47.         PlainCharacterPAT + ur"+?)\n",
  48.         re.DOTALL | re.UNICODE | re.MULTILINE)
  49. # UrlRE           = re.compile(ur'(?:(?:wiki|file|https?|ftp|rel)://|mailto:)[^"\s<>]*',
  50. #         re.DOTALL | re.UNICODE | re.MULTILINE)  # SPN
  51. UrlRE           = re.compile(ur'(?:(?:wiki|file|https?|ftp|rel)://|mailto:)'
  52.         ur'(?:(?![.,;:!?)]+["\s])[^"\s<>])*(?:>\S+)?',
  53.         re.DOTALL | re.UNICODE | re.MULTILINE)  # SPN
  54.  
  55.  
  56.  
  57. TitledUrlRE =  re.compile(
  58.         ur"\[(?P<titledurlUrl>" + UrlRE.pattern + ur")"
  59.         ur"(?:(?P<titledurlDelim>[ \t]*" + TitleWikiWordDelimiterPAT + ur")"
  60.         ur"(?P<titledurlTitle>" + PlainCharacterPAT + ur"+?))?\]",
  61.         re.DOTALL | re.UNICODE | re.MULTILINE)
  62.  
  63.  
  64. # The following 2 are not in WikiFormatting.FormatExpressions
  65. BulletRE        = re.compile(ur"^(?P<indentBullet>[ \t]*)(?P<actualBullet>\*[ \t])",
  66.         re.DOTALL | re.UNICODE | re.MULTILINE)  # SPN
  67. NumericBulletRE = re.compile(ur"^(?P<indentNumeric>[ \t]*)(?P<preLastNumeric>(?:\d+\.)*)(\d+)\.[ \t]",
  68.         re.DOTALL | re.UNICODE | re.MULTILINE)  # SPN
  69.  
  70.  
  71. # WikiWords
  72. #WikiWordRE      = re.compile(r"\b(?<!~)(?:[A-Z\xc0-\xde\x8a-\x8f]+[a-z\xdf-\xff\x9a-\x9f]+[A-Z\xc0-\xde\x8a-\x8f]+[a-zA-Z0-9\xc0-\xde\x8a-\x8f\xdf-\xff\x9a-\x9f]*|[A-Z\xc0-\xde\x8a-\x8f]{2,}[a-z\xdf-\xff\x9a-\x9f]+)\b")
  73. #WikiWordRE2     = re.compile("\[[a-zA-Z0-9\-\_\s]+?\]")
  74.  
  75.  
  76. # TODO To unicode
  77.  
  78. UPPERCASE = mbcsDec(string.uppercase)[0]
  79. LOWERCASE = mbcsDec(string.lowercase)[0]
  80. LETTERS = UPPERCASE + LOWERCASE
  81.  
  82.  
  83. # # Pattern string for delimiter for search fragment after wiki word
  84. # WikiWordSearchFragDelimPAT = ur"#"
  85. # # Pattern string for search fragment itself
  86. # WikiWordSearchFragPAT = ur"(?:#.|[^ \t\n#])+"
  87.  
  88.  
  89. singleWikiWord    =          (ur"(?:[" +
  90.                              UPPERCASE +
  91.                              # "A-Z\xc0-\xde\x8a-\x8f"
  92.                              ur"]+[" +
  93.                              LOWERCASE +
  94.                              # "a-z\xdf-\xff\x9a-\x9f"
  95.                              ur"]+[" +
  96.                              UPPERCASE +
  97.                              # "A-Z\xc0-\xde\x8a-\x8f"
  98.                              ur"]+[" +
  99.                              LETTERS + string.digits +
  100.                              # "a-zA-Z0-9\xc0-\xde\x8a-\x8f\xdf-\xff\x9a-\x9f"
  101.                              ur"]*|[" +
  102.                              UPPERCASE +
  103.                              # "A-Z\xc0-\xde\x8a-\x8f"
  104.                              ur"]{2,}[" +
  105.                              LOWERCASE +
  106.                              # "a-z\xdf-\xff\x9a-\x9f"
  107.                              ur"]+)")
  108.  
  109. WikiWordRE      = re.compile(ur"\b(?<!~)" + singleWikiWord + ur"\b", # ur"(?:/" + singleWikiWord +
  110.                              # ur")*\b",
  111.                              re.DOTALL | re.UNICODE | re.MULTILINE)
  112.  
  113.  
  114. AnchorStart = ur"!"
  115. AnchorStartPAT = ur"!"
  116.  
  117. # Special version for syntax highlighting to allow appending search expression with '#'
  118. WikiWordEditorRE = re.compile(ur"(?P<wikiword>" + WikiWordRE.pattern +
  119.         ur")(?:#(?P<wikiwordSearchfrag>(?:(?:#.)|[^ \t\n#])+)|" + 
  120.         AnchorStartPAT + ur"(?P<wikiwordAnchorfrag>[A-Za-z0-9\_]+))?",
  121.         re.DOTALL | re.UNICODE | re.MULTILINE)
  122.  
  123.  
  124. # Only to exclude them from WikiWordRE2
  125. FootnoteRE     = re.compile(ur"\[[0-9]+?\]",
  126.         re.DOTALL | re.UNICODE | re.MULTILINE)
  127.  
  128.  
  129. # Pattern string for non camelcase wiki word
  130. WikiWordNccPAT = ur"[\w\-\_ \t]+?"
  131.  
  132.  
  133.  
  134. WikiWordRE2     = re.compile(ur"\[(?:" + WikiWordNccPAT + ur")\]",
  135.         re.DOTALL | re.UNICODE | re.MULTILINE)
  136.  
  137. # Special version for syntax highlighting to allow appending search expression with '#'
  138. # WikiWordEditorRE2      = re.compile(
  139. #         ur"\[(?P<wikiwordnccTitle>[^\]\|]+" + TitleWikiWordDelimiterPAT + ur"\s*)?"
  140. #         ur"(?P<wikiwordncc>" + WikiWordNccPAT + ur")\]"
  141. #         ur"(?:#(?P<wikiwordnccSearchfrag>(?:(?:#.)|[^ \t\n#])+))?",
  142. #         re.DOTALL | re.UNICODE | re.MULTILINE)
  143. WikiWordEditorRE2      = re.compile(
  144.         ur"\[(?P<wikiwordncc>" + WikiWordNccPAT + ur")"
  145.         ur"(?:(?P<wikiwordnccDelim>[ \t]*" + TitleWikiWordDelimiterPAT + ur")"
  146.         ur"(?P<wikiwordnccTitle>" + PlainCharacterPAT + ur"+?))?\]"
  147.         ur"(?:#(?P<wikiwordnccSearchfrag>(?:(?:#.)|[^ \t\n#])+)|" +
  148.         AnchorStartPAT + ur"(?P<wikiwordnccAnchorfrag>[A-Za-z0-9\_]+))?",
  149.         re.DOTALL | re.UNICODE | re.MULTILINE)
  150.  
  151. SearchFragmentUnescapeRE   = re.compile(ur"#(.)",
  152.                               re.DOTALL | re.UNICODE | re.MULTILINE)
  153.  
  154.  
  155. # For spell checking
  156. TextWordRE = re.compile(ur"(?P<negative>[0-9]+|"+ UrlRE.pattern + u"|" +
  157.         WikiWordRE.pattern + ur")|\b[\w']+",
  158.         re.DOTALL | re.UNICODE | re.MULTILINE)  # SP only
  159.  
  160.  
  161.  
  162. # parses the dynamic properties
  163. PropertyRE      = re.compile(ur"\[[ \t]*(?P<propertyName>[\w\-\_\.]+?)[ \t]*" +
  164.                   ur"[=:][ \t]*(?P<propertyValue>[\w\-\_ \t:;,.!?#/|]+?)\]",
  165.                   re.DOTALL | re.UNICODE | re.MULTILINE)
  166.  
  167.  
  168. # InsertionRE     = re.compile(ur"\[:[ \t]*(?P<insertionKey>[\w\-\_\.]+?)[ \t]*" +
  169. #                   ur"[:][ \t]*(?P<insertionValue>[\w\-\_ \t;,.!?#/|]+?)\]",
  170. #                   re.DOTALL | re.UNICODE | re.MULTILINE)
  171.  
  172. InsertionValueRE = re.compile(ur"(?:(?P<insertionValue>[\w][\w\-\_ \t,.!?#/|]*)|"
  173.                   ur"(?P<insertionQuoteStarter>\"+|'+|/+|\\+)"
  174.                   ur"(?P<insertionQuotedValue>.*?)(?P=insertionQuoteStarter))",
  175.                   re.DOTALL | re.UNICODE | re.MULTILINE)
  176.  
  177. InsertionAppendixRE = re.compile(ur";[ \t]*(?:"
  178.                   ur"(?P<insertionAppendix>[\w][\w\-\_ \t,.!?#/|]*)|"
  179.                   ur"(?P<insertionApxQuoteStarter>\"+|'+|/+|\\+)"
  180.                   ur"(?P<insertionQuotedAppendix>.*?)(?P=insertionApxQuoteStarter))",
  181.                   re.DOTALL | re.UNICODE | re.MULTILINE)
  182.  
  183. InsertionRE     = re.compile(ur"\[:[ \t]*(?P<insertionKey>[\w][\w\-\_\.]*)[ \t]*" +
  184.                   ur":[ \t]*(?P<insertionContent>" +
  185.                   InsertionValueRE.pattern +
  186.                   ur"(?:" + InsertionAppendixRE.pattern + ur")*)\]",
  187.                   re.DOTALL | re.UNICODE | re.MULTILINE)
  188.  
  189.  
  190. # Reverse REs for autocompletion
  191. revSingleWikiWord    =       (ur"(?:[" +
  192.                              LETTERS + string.digits +
  193.                              ur"]*[" +
  194.                              UPPERCASE+
  195.                              ur"])")
  196.  
  197. RevWikiWordRE      = re.compile(ur"^" + # revSingleWikiWord + ur"(?:/" +
  198.                              revSingleWikiWord + ur"(?![\~])\b",
  199.                              re.DOTALL | re.UNICODE | re.MULTILINE)  # SPN
  200.  
  201. RevWikiWordRE2     = re.compile(ur"^[\w\-\_ \t.]+?\[",
  202.         re.DOTALL | re.UNICODE | re.MULTILINE)  # SPN
  203.  
  204. RevPropertyValue     = re.compile(ur"^([\w\-\_ \t:;,.!?#/|]*?)([ \t]*[=:][ \t]*)([\w\-\_ \t\.]+?)\[",
  205.         re.DOTALL | re.UNICODE | re.MULTILINE)  # SPN
  206.  
  207.  
  208. # script blocks
  209. ScriptRE        = re.compile(u"\<%(.*?)%\>", re.DOTALL)
  210.  
  211. # Auto generated area
  212. AutoGenAreaRE = re.compile(ur"^([ \t]*<<[ \t]+)([^\n]+\n)(.*?)^([ \t]*>>[ \t]*\n)", re.DOTALL | re.LOCALE | re.MULTILINE)
  213.         
  214. # todos, captures the todo item text
  215. ## ToDoREWithContent = re.compile(u"^\s*((?:todo|action|track|issue|question|project)\\.?[^\\:\\s]*:[^\\r\\n]+)", re.MULTILINE)
  216.  
  217. ToDoREWithContent = re.compile(ur"\b(?P<todoIndent>)"    # ur"(?P<todoIndent>^[ \t]*)"
  218.         ur"(?P<todoName>(?:todo|done|wait|action|track|issue|question|project)(?:\.[^:\s]+)?)"
  219.         ur"(?P<todoDelimiter>:)(?P<todoValue>" + PlainCharacterPAT + ur"+?)(?:$|(?=\|))",
  220.         re.DOTALL | re.UNICODE | re.MULTILINE)
  221.  
  222. # todos, used in the tree control to parse saved todos. Because they were
  223. #   already identified as todos, the regexp can be quite simple
  224. ToDoREWithCapturing = re.compile(ur"^([^:\s]+):[ \t]*(.+?)$",
  225.         re.DOTALL | re.UNICODE | re.MULTILINE)
  226.  
  227.  
  228. # used to detect indent levels
  229.  
  230. # The following 2 are not in WikiFormatting.FormatExpressions
  231. EmptyLineRE     = re.compile(ur"^[ \t\r\n]*$",
  232.         re.DOTALL | re.UNICODE | re.MULTILINE)
  233.  
  234. HorizLineRE     = re.compile(u"----+", re.DOTALL | re.UNICODE | re.MULTILINE)
  235.  
  236. # suppression expression
  237. # Orig: SuppressHighlightingRE = re.compile("\<\<(.*?)\>\>", re.DOTALL)
  238. SuppressHighlightingRE = re.compile(ur"^(?P<suppressIndent>[ \t]*)<<[ \t]*\n"+
  239.         ur"(?P<suppressContent>.*?)\n[ \t]*>>[ \t]*$",
  240.         re.DOTALL | re.UNICODE | re.MULTILINE)
  241.  
  242. AnchorRE = re.compile(ur"^[ \t]*anchor:[ \t]*(?P<anchorValue>[A-Za-z0-9\_]+)\n",
  243.         re.DOTALL | re.UNICODE | re.MULTILINE)
  244.  
  245.  
  246. TableRowDelimiterPAT = ur"\n"
  247.  
  248. TableRE = re.compile(ur"(?P<tableBegin>^[ \t]*<<\|[ \t]*$)"
  249.         ur"(?P<tableContent>" + PlainCharacterPAT +
  250.         ur"*?)(?P<tableEnd>^[ \t]*>>[ \t]*$)",
  251.         re.DOTALL | re.UNICODE | re.MULTILINE)
  252.  
  253.  
  254. PreBlockRE = re.compile(ur"(?P<preBegin>^[ \t]*<<pre[ \t]*\n)"
  255.         ur"(?P<preContent>."         #  + PlainCharacterPAT +
  256.         ur"*?)(?P<preEnd>\n[ \t]*>>[ \t]*$(\n)?)",
  257.         re.DOTALL | re.UNICODE | re.MULTILINE)
  258.  
  259.